﻿using System;
using System.IO;
using System.Configuration;
using System.Collections.Generic;

namespace AgileShare.Framework.Library.Helpers
{
    /// <summary>
    /// 日志工具类
    /// </summary>
    //public class LogUtility
    //{
    //    internal static List<LogLevel> _LogLevelList = null;
    //    internal static LogLevel _LogLevel = LogLevel.Error;

    //    static LogUtility()
    //    {
    //        _LogLevelList = new List<LogLevel>();
    //        _LogLevelList.Add(LogLevel.Debug);
    //        _LogLevelList.Add(LogLevel.Information);
    //        _LogLevelList.Add(LogLevel.Warn);
    //        _LogLevelList.Add(LogLevel.Error);

    //        string logLevelText = ConfigurationManager.AppSettings["Wicresoft.ITSG.Components.LogLevel"];
    //        if (String.IsNullOrEmpty(logLevelText))
    //        {
    //            logLevelText = "ERROR";
    //        }
    //        else
    //        {
    //            logLevelText = logLevelText.ToUpper();
    //        }
    //        foreach (LogLevel logLevel in _LogLevelList)
    //        {
    //            if (Convert.ToString(logLevel).ToUpper() == logLevelText)
    //            {
    //                _LogLevel = logLevel;
    //                break;
    //            }
    //        }
    //    }

    //    /// <summary>
    //    /// 获取日志管理器
    //    /// </summary>
    //    /// <returns></returns>
    //    public static ILogManager CreateLogManager()
    //    {
    //        return new FileLogManager();
    //    }

    //    /// <summary>
    //    /// 获取日志级别
    //    /// </summary>
    //    /// <returns></returns>
    //    public static LogLevel GetLogLevel()
    //    {
    //        return _LogLevel;
    //    }

    //    public static void WriteLog(string log)
    //    {
    //        string logPath = @"e:\MossLog\Notice.txt";
    //        FileStream fs = new FileStream(@logPath, FileMode.OpenOrCreate, FileAccess.Write);
    //        StreamWriter m_streamWriter = new StreamWriter(fs);
    //        m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
    //        m_streamWriter.WriteLine(log + "," + "\n");
    //        m_streamWriter.Flush();
    //        m_streamWriter.Close();
    //        fs.Close();
    //    }
    //}

    //public enum LogLevel
    //{
    //    Debug = 0,
    //    Information = 1,
    //    Warn = 2,
    //    Error = 3
    //}

    //#region Interface and Abstract Class

    ///// <summary>
    ///// 日志管理器接口
    ///// </summary>
    //public interface ILogManager
    //{
    //    void Debug(string messageInfo);
    //    void Debug(System.Exception ex);
    //    void Debug(string messageInfo, System.Exception ex);

    //    void Information(string messageInfo);
    //    void Information(System.Exception ex);
    //    void Information(string messageInfo, System.Exception ex);

    //    void Warn(string messageInfo);
    //    void Warn(System.Exception ex);
    //    void Warn(string messageInfo, System.Exception ex);

    //    void Error(string messageInfo);
    //    void Error(System.Exception ex);
    //    void Error(string messageInfo, System.Exception ex);

    //}

    ///// <summary>
    ///// 日志管理器抽象类
    ///// </summary>
    //public abstract class AbstractLogManager : ILogManager
    //{
    //    private static object _Lock = new object();

    //    public void Debug(string messageInfo)
    //    {
    //        InternalLog(LogLevel.Debug, messageInfo, null);
    //    }

    //    public void Debug(System.Exception ex)
    //    {
    //        InternalLog(LogLevel.Debug, String.Empty, ex);
    //    }

    //    public void Debug(string messageInfo, System.Exception ex)
    //    {
    //        InternalLog(LogLevel.Debug, messageInfo, ex);
    //    }

    //    public void Information(string messageInfo)
    //    {
    //        InternalLog(LogLevel.Information, messageInfo, null);
    //    }

    //    public void Information(System.Exception ex)
    //    {
    //        InternalLog(LogLevel.Information, String.Empty, ex);
    //    }

    //    public void Information(string messageInfo, System.Exception ex)
    //    {
    //        InternalLog(LogLevel.Information, messageInfo, ex);
    //    }

    //    public void Warn(string messageInfo)
    //    {
    //        InternalLog(LogLevel.Warn, messageInfo, null);
    //    }

    //    public void Warn(System.Exception ex)
    //    {
    //        InternalLog(LogLevel.Warn, String.Empty, ex);
    //    }

    //    public void Warn(string messageInfo, System.Exception ex)
    //    {
    //        InternalLog(LogLevel.Warn, messageInfo, ex);
    //    }

    //    public void Error(string messageInfo)
    //    {
    //        InternalLog(LogLevel.Error, messageInfo, null);
    //    }

    //    public void Error(System.Exception ex)
    //    {
    //        InternalLog(LogLevel.Error, String.Empty, ex);
    //    }

    //    public void Error(string messageInfo, System.Exception ex)
    //    {
    //        InternalLog(LogLevel.Error, messageInfo, ex);
    //    }

    //    private void InternalLog(LogLevel currentLogLevel, string messageInfo, System.Exception ex)
    //    {
    //        lock (_Lock)
    //        {
    //            // 低于设置的级别，则不输出
    //            if (LogUtility._LogLevel <= currentLogLevel)
    //            {
    //                try
    //                {
    //                    Log(currentLogLevel.ToString(), messageInfo, ex);
    //                }
    //                catch(Exception innerEx)
    //                {
    //                    if(LogUtility._LogLevel == LogLevel.Debug)
    //                    {
    //                        throw innerEx;
    //                    }
    //                }
    //            }
    //        }
    //    }

    //    protected abstract void Log(string currentLogLevelText, string messageInfo, System.Exception ex);
    //}

    //#endregion

    //#region Instances of LogManager

    ///// <summary>
    ///// 文件日志管理器
    ///// </summary>
    //internal class FileLogManager : AbstractLogManager
    //{
    //    private static string _LogFolder = ConfigurationManager.AppSettings["Wicresoft.ITSG.Components.LogFolder"];

    //    internal FileLogManager() { }

    //    protected override void Log(string currentLogLevelText, string messageInfo, System.Exception ex)
    //    {
    //        string logInfo = "";
    //        if (ex == null)
    //        {
    //            logInfo = String.Format("{0}:{1}\r\n", new object[] { DateTime.Now.ToString("HH:mm:ss"), messageInfo });
    //        }
    //        else
    //        {
    //            if (String.IsNullOrEmpty(messageInfo))
    //            {
    //                logInfo = String.Format("{0}:{1}\r\n{2}\r\n", new object[] { DateTime.Now.ToString("HH:mm:ss"), ex.Message, ex.StackTrace });
    //            }
    //            else
    //            {
    //                logInfo = String.Format("{0}:{1}\r\n{2}\r\n{3}\r\n", new object[] { DateTime.Now.ToString("HH:mm:ss"), messageInfo, ex.Message, ex.StackTrace });
    //            }
    //        }
    //        logInfo = currentLogLevelText + "-" + logInfo;
    //        Console.WriteLine(logInfo);
    //        StreamWriter sw = null;
    //        try
    //        {
    //            DirectoryInfo di = new DirectoryInfo(_LogFolder);
    //            if (!di.Exists)
    //            {
    //                di.Create();
    //            }
    //            string logFile = di.FullName + Path.DirectorySeparatorChar + DateTime.Today.ToString("yyyy-MM-dd") + ".log";
    //            if (File.Exists(logFile))
    //            {
    //                sw = File.AppendText(logFile);
    //            }
    //            else
    //            {
    //                sw = File.CreateText(logFile);
    //            }
    //            sw.WriteLine(logInfo);
    //            sw.Flush();
    //        }
    //        catch (Exception innerException)
    //        {
    //            throw new Exception("请检查Web.config中的appSettings节点，请确认是否已经配置“Wicresoft.ITSG.Components.LogFolder”或指定路径错误或无权限访问！内部异常：" + innerException.Message);
    //        }
    //        finally
    //        {
    //            if (sw != null)
    //            {
    //                sw.Close();
    //                sw.Dispose();
    //            }
    //        }
    //    }
    //}
    //#endregion
}
